
Es importante que en un informe académico se incorpore visualización de datos, pues muchas veces resulta una representación más eficiente de los análisis en comparación con textos y tablas. A continuación, introduciremos algunos tópicos básicos y avanzados en visualización de datos con ggplot2. Utilizaremos como ejemplo los datos del Estudio Longitudinal Social de Chile (ELSOC, 2016).
#Instalamos los paquetes que necesitaremos
#install.packages("ggplot2") #Gráficos
library(ggplot2)
library(haven)
#Leemos el conjunto de datos.
load(url("https://juancarloscastillo.github.io/metsoc-facsouchile/documents/data/ELSOC_W01_v2.00.RData"))
n
## function ()
## {
## from_context("..group_size")
## }
## <bytecode: 0x330ea28>
## <environment: namespace:dplyr>
#Establecemos los casos perdidos a variables de interés.
elsoc_w01[elsoc_w01==-999 | elsoc_w01==-888] <- NA
Una vez cargado el conjunto de datos y asignado los casos perdidos, podemos comenzar realizar diferentes tipos de visualizaciones de datos.
#Grafico de barras para la variabla horas habituales por tramos
ggplot(elsoc_w01, aes(x = as.factor(d05_01))) +
geom_bar(width = 0.4, fill=rgb(0.1,0.3,0.5,0.7) ,aes(y = (..count..)/sum(..count..))) +
scale_x_discrete("Provenir de familia adinerada",
labels = c("Nada importante",
"Poco importante",
"Algo importante",
"Bastante importante",
"Muy importante"), na.translate = FALSE) +
scale_y_continuous("Frecuencia porcentual",labels=scales::percent ) +
labs(title = "Gráfico de barras",
subtitle = "¿Qué tan importante es provenir de una familia adinerada?")
ggplot(data = elsoc_w01, aes(x = c33, y = d05_03)) +
geom_jitter(size = 1, color = 'blue', alpha = 0.4) +
geom_violin(aes(fill = d05_01), color = 'black', alpha = 0.8) +
xlab('Identificación clase social subjetiva') +
ylab('Importacia atribuida a la ambición') +
ggtitle('Dispersión bivariada de datos: clase social subjetiva y ambición') +
theme_minimal()
ggplot(elsoc_w01, aes(x = as.numeric(m0_edad))) +
geom_density(color="black") +
stat_function(fun = dnorm,
args = with(elsoc_w01, c(mean = mean(m0_edad, na.rm=T), sd = sd(m0_edad, na.rm=T))), color = "red")+
scale_y_continuous("Densidad") +
labs(title = "Histograma",
subtitle = "Edad")
-Gráfico de mosaico
Para quienes deban aplicar un modelo de regresión logística binaria (RLB), recomendamos utilizar los gráficos de mosaico para visualizar descriptivamente las variables categóricas.
load("../../data/titanic.Rdata")
pacman::p_load(sjmisc, descr,tidyverse, scales, xtable, ggmosaic, stargazer)
ggplot(data = tt) +
geom_mosaic(aes(x = product(sex), fill=survived)) +
theme(legend.position="none", text = element_text(size = 25),axis.title=element_blank())
Finalmente, podemos realizar gráficos dinámicos. Usando los datos del paquete gapminder, construiremos un gráfico animado que incluya la expectativa de vida de los diferentes países y PIB per cápita en el transcurso de los años (gráfico con tres variables interactuando).
#Instalar y cargar paquetes
# devtools::install_github("r-rust/gifski") # esta se instala desde devtools; en linux requiere también instalar cargo (sudo apt-get install cargo)
pacman::p_load(gifski,gapminder,gganimate,dygraphs,png)
# Creditos en GitHub a Thomasp85
# https://gist.github.com/thomasp85/05169ad44ddcc8ed56da6ff7bf7fbe36
dato<-gapminder
ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
facet_wrap(~continent) +
# Acá con gganimate especificamos el gif
labs(title = 'Year: {frame_time}', x = 'GDP per capita', y = 'life expectancy') +
transition_time(year) +
ease_aes('linear')
##
Frame 1 (1%)
Frame 2 (2%)
Frame 3 (3%)
Frame 4 (4%)
Frame 5 (5%)
Frame 6 (6%)
Frame 7 (7%)
Frame 8 (8%)
Frame 9 (9%)
Frame 10 (10%)
Frame 11 (11%)
Frame 12 (12%)
Frame 13 (13%)
Frame 14 (14%)
Frame 15 (15%)
Frame 16 (16%)
Frame 17 (17%)
Frame 18 (18%)
Frame 19 (19%)
Frame 20 (20%)
Frame 21 (21%)
Frame 22 (22%)
Frame 23 (23%)
Frame 24 (24%)
Frame 25 (25%)
Frame 26 (26%)
Frame 27 (27%)
Frame 28 (28%)
Frame 29 (29%)
Frame 30 (30%)
Frame 31 (31%)
Frame 32 (32%)
Frame 33 (33%)
Frame 34 (34%)
Frame 35 (35%)
Frame 36 (36%)
Frame 37 (37%)
Frame 38 (38%)
Frame 39 (39%)
Frame 40 (40%)
Frame 41 (41%)
Frame 42 (42%)
Frame 43 (43%)
Frame 44 (44%)
Frame 45 (45%)
Frame 46 (46%)
Frame 47 (47%)
Frame 48 (48%)
Frame 49 (49%)
Frame 50 (50%)
Frame 51 (51%)
Frame 52 (52%)
Frame 53 (53%)
Frame 54 (54%)
Frame 55 (55%)
Frame 56 (56%)
Frame 57 (57%)
Frame 58 (58%)
Frame 59 (59%)
Frame 60 (60%)
Frame 61 (61%)
Frame 62 (62%)
Frame 63 (63%)
Frame 64 (64%)
Frame 65 (65%)
Frame 66 (66%)
Frame 67 (67%)
Frame 68 (68%)
Frame 69 (69%)
Frame 70 (70%)
Frame 71 (71%)
Frame 72 (72%)
Frame 73 (73%)
Frame 74 (74%)
Frame 75 (75%)
Frame 76 (76%)
Frame 77 (77%)
Frame 78 (78%)
Frame 79 (79%)
Frame 80 (80%)
Frame 81 (81%)
Frame 82 (82%)
Frame 83 (83%)
Frame 84 (84%)
Frame 85 (85%)
Frame 86 (86%)
Frame 87 (87%)
Frame 88 (88%)
Frame 89 (89%)
Frame 90 (90%)
Frame 91 (91%)
Frame 92 (92%)
Frame 93 (93%)
Frame 94 (94%)
Frame 95 (95%)
Frame 96 (96%)
Frame 97 (97%)
Frame 98 (98%)
Frame 99 (99%)
Frame 100 (100%)
## Finalizing encoding... done!
Tal como se puede observar, tenemos cuatro variables interactuando en el gráfico: a) países (categórica); b) expectativa de vida (intervalar); c) PIB per cápita (intervalar); y d) tiempo en años (intervalar).
-Tabla para reportar un modelo de regresión
El reporte de resultados de los parámetros estimados (e.g., coeficientes B, F de Levene, R2, suma de cuadrados) podemos realizarlo en tablas con este formato y estilo
Primero se realiza un ajuste de las variables:
elsoc_w01[elsoc_w01==-999 | elsoc_w01==-888] <- NA
elsoc_w01$sexo<- as.factor(car::recode(elsoc_w01$m0_sexo, "1='Hombre'; 2='Mujer'"))
elsoc_w01$ed<- as.factor(elsoc_w01$m01)
elsoc_w01$edu<- car::recode(elsoc_w01$ed, "10 ='Universitaria';1:3='Básica'; 4:5='Media'; 6:7='Tecnica Superior'; 8:9 ='Universitaria'")
elsoc_w01$edu<- as.factor(elsoc_w01$edu)
Luego, se estiman los modelos:
modelo1<- lm(d01_01 ~ m0_edad+ m29 +sexo, data=elsoc_w01)
modelo2<- lm(d01_01 ~ m0_edad+ m29 +sexo+edu, data=elsoc_w01)
Finalmente, reporte con la librería texreg
pacman::p_load(texreg)
htmlreg(list(modelo1, modelo2),
custom.model.names = c("Modelo 1", "Modelo 2"),
custom.coef.names = c("Intercepto", "Edad", "Ingreso", "Mujer", "Media","Técnica","Universitaria"), #Cambiar nombre de las variables
include.f=TRUE,
include.rmse=FALSE,
custom.note = "%stars., errores estándar en paréntesis",
caption=" ",
#single.row = T, #para que la DS este en una linea
booktabs = TRUE, dcolumn = TRUE, doctype = FALSE)
| Modelo 1 | Modelo 2 | ||
|---|---|---|---|
| Intercepto | 4.59*** | 3.36*** | |
| (0.11) | (0.14) | ||
| Edad | -0.00 | 0.01*** | |
| (0.00) | (0.00) | ||
| Ingreso | 0.00* | 0.00* | |
| (0.00) | (0.00) | ||
| Mujer | -0.13* | -0.07 | |
| (0.06) | (0.06) | ||
| Media | 0.60*** | ||
| (0.08) | |||
| Técnica | 1.07*** | ||
| (0.10) | |||
| Universitaria | 1.37*** | ||
| (0.10) | |||
| R2 | 0.01 | 0.08 | |
| Adj. R2 | 0.00 | 0.08 | |
| Num. obs. | 2339 | 2337 | |
| F statistic | 4.80 | 35.93 | |
| p < 0.001, p < 0.01, p < 0.05., errores estándar en paréntesis | |||